package jvm.VMExecSubsystem;

import java.lang.reflect.Method;

/**
 * Javaclass执行工具
 *
 * @author msi
 */
public class JavaclassExecuter {

    /**
     * 执行外部传过来的代表一个Java类的Byte数组<br>
     * 将输入类的byte数组中代表java.lang.System的CONSTANT_Utf8_info常量修改为劫持后的HackSystem类
     * 执行方法为该类的static main(String[] args)方法，输出结果为该类向System.out/err输出的信息
     *
     * @param classByte 代表一个Java类的Byte数组
     * @return 执行结果
     */
    public static String execute(byte[] classByte) {
        HackSystem.clearBuffer();
        ClassModifier cm = new ClassModifier(classByte);
        byte[] modiBytes = cm.modifyUTF8Constant("java/lang/System", "org/fenixsoft/classloading/execute/HackSystem");
        HotSwapClassLoader loader = new HotSwapClassLoader();
        Class clazz = loader.loadByte(modiBytes);
        try {
            Method method = clazz.getMethod("main", new Class[]{String[].class});
            method.invoke(null, new String[]{null});
        } catch (Throwable e) {
            e.printStackTrace(HackSystem.out);
        }
        return HackSystem.getBufferString();
    }
}
/**
 * 该类是提供给外部调用的入口。只有一个execute方法。输入用符合Class文件格式的byte[]数组替换掉System的符号引用，由于每次执行execute都会生成一个新的classLoader，因此同一个类可以实现重复加载。返回反射调用这个类的main方法。
 * 如果运行期间出现任何异常，将异常信息打印到HackSystem.out中。
 */
